/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package bean;


import datos.Permiso;
import datos.Usuario;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIParameter;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import negocio.GestorUsuarioLocal;

/**
 *
 * @author Ing. Monica Merlo, Ing. Agustin  Fernandez
 */

public class UsuarioBean {
    @EJB (beanName="GestorUsuarioBean")
    private GestorUsuarioLocal gestorUsuarioBean;

    private int id;
    private String nombre;
    private String apellido;
    private String usuario;
    private String password;
    private String confirmaPassword;
    private String nuevopassword;
    private int numeroDocumento;
    private String tipoDocumento="DNI";
    private int idDomicilio;
    private String calle;
    private String numero;
    private String barrio;
    private int piso;
    private String depto;
    private String codPostal;
    private List<String> permisos;
    private List<String> permisosAsignados;
    private boolean mostrarModificar = false;
    private boolean mostrarAgregar = false;
    private boolean filtroAplicado = false;
    private List usuarios = null;
    private String tooltipPermiso;
    private String nombrePermiso;

    /** Creates a new instance of UsuarioBean */
    public UsuarioBean() {
    }

    /**
     * @return the id
     */
    public int getId() {
        return id;
    }

    /**
     * @param id the id to set
     */
    public void setId(int id) {
        this.id = id;
    }

    /**
     * @return the nombre
     */
    public String getNombre() {
        return nombre;
    }

    /**
     * @param nombre the nombre to set
     */
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    /**
     * @return the apellido
     */
    public String getApellido() {
        return apellido;
    }

    /**
     * @param apellido the apellido to set
     */
    public void setApellido(String apellido) {
        this.apellido = apellido;
    }

    /**
     * @return the usuario
     */
    public String getUsuario() {
        return usuario;
    }

    /**
     * @param usuario the usuario to set
     */
    public void setUsuario(String usuario) {
        this.usuario = usuario;
    }

    /**
     * @return the password
     */
    public String getPassword() {
        return password;
    }

    /**
     * @param password the password to set
     */
    public void setPassword(String password) {
        this.password = password;
    }

    /**
     * @return the confirmaPassword
     */
    public String getConfirmaPassword() {
        return confirmaPassword;
    }

    /**
     * @param confirmaPassword the confirmaPassword to set
     */
    public void setConfirmaPassword(String confirmaPassword) {
        this.confirmaPassword = confirmaPassword;
    }


    /**
     * @return the numeroDocumento
     */
    public int getNumeroDocumento() {
        return numeroDocumento;
    }

    /**
     * @param numeroDocumento the numeroDocumento to set
     */
    public void setNumeroDocumento(int numeroDocumento) {
        this.numeroDocumento = numeroDocumento;
    }

    /**
     * @return the tipoDocumento
     */
    public String getTipoDocumento() {
        return tipoDocumento;
    }

    /**
     * @param tipoDocumento the tipoDocumento to set
     */
    public void setTipoDocumento(String tipoDocumento) {
        this.tipoDocumento = tipoDocumento;
    }

    /**
     * @return the idDomicilio
     */
    public int getIdDomicilio() {
        return idDomicilio;
    }

    /**
     * @param idDomicilio the idDomicilio to set
     */
    public void setIdDomicilio(int idDomicilio) {
        this.idDomicilio = idDomicilio;
    }

    /**
     * @return the calle
     */
    public String getCalle() {
        return calle;
    }

    /**
     * @param calle the calle to set
     */
    public void setCalle(String calle) {
        this.calle = calle;
    }

    /**
     * @return the numero
     */
    public String getNumero() {
        return numero;
    }

    /**
     * @param numero the numero to set
     */
    public void setNumero(String numero) {
        this.numero = numero;
    }

    /**
     * @return the barrio
     */
    public String getBarrio() {
        return barrio;
    }

    /**
     * @param barrio the barrio to set
     */
    public void setBarrio(String barrio) {
        this.barrio = barrio;
    }

    /**
     * @return the piso
     */
    public int getPiso() {
        return piso;
    }

    /**
     * @param piso the piso to set
     */
    public void setPiso(int piso) {
        this.piso = piso;
    }

    /**
     * @return the depto
     */
    public String getDepto() {
        return depto;
    }

    /**
     * @param depto the depto to set
     */
    public void setDepto(String depto) {
        this.depto = depto;
    }

    /**
     * @return the codPostal
     */
    public String getCodPostal() {
        return codPostal;
    }

    /**
     * @param codPostal the codPostal to set
     */
    public void setCodPostal(String codPostal) {
        this.codPostal = codPostal;
    }

    /**
     *
     * @return
     */
    public List getUsuarios(){
        if(!this.filtroAplicado)this.usuarios = this.gestorUsuarioBean.usuarios();
        return this.usuarios;
    }

    /**
     *
     * @param usuarios
     */
    public void setUsuarios(List usuarios){
        this.usuarios = usuarios;
    }

     /**
     * @return the permisos
     */
    public List<String> getPermisos() {
        if(this.mostrarModificar)return this.permisos;
        else return this.gestorUsuarioBean.permisos();
    }

    /**
     * @param permisos the permisosAsignados to set
     */
    public void setPermisos(List<String> permisos) {
        this.permisos = permisos;
    }
    
    /**
     * @return the permisosAsignados
     */
    public List<String> getPermisosAsignados() {
        return permisosAsignados;
    }

    /**
     * @param permisosAsignados the permisosAsignados to set
     */
    public void setPermisosAsignados(List<String> permisosAsignados) {
        this.permisosAsignados = permisosAsignados;
    }

    /**
     * @return the mostrarModificar
     */
    public boolean isMostrarModificar() {
        return mostrarModificar;
    }

    /**
     * @param mostrarModificar the mostrarModificar to set
     */
    public void setMostrarModificar(boolean mostrarModificar) {
        this.mostrarModificar = mostrarModificar;
    }

    /**
     * @return the mostrarAgregar
     */
    public boolean isMostrarAgregar() {
        return mostrarAgregar;
    }

    /**
     * @param mostrarAgregar the mostrarAgregar to set
     */
    public void setMostrarAgregar(boolean mostrarAgregar) {
        this.mostrarAgregar = mostrarAgregar;
    }

    /**
     * @return the tooltipPermiso
     */
    public String getTooltipPermiso() {
        return tooltipPermiso;
    }

    /**
     * @param tooltipPermiso the tooltipPermiso to set
     */
    public void setTooltipPermiso(String tooltipPermiso) {
        this.tooltipPermiso = tooltipPermiso;
    }

    /**
     * @return the filtroAplicado
     */
    public boolean isFiltroAplicado() {
        return filtroAplicado;
    }

    /**
     * @param filtroAplicado the filtroAplicado to set
     */
    public void setFiltroAplicado(boolean filtroAplicado) {
        this.filtroAplicado = filtroAplicado;
    }

    /**
     *
     * @return
     */
    public String filtrarUsuarios(){
        this.usuarios = this.gestorUsuarioBean.filtrarUsuarios("%"+this.nombre.toUpperCase().trim()+"%", "%"+this.apellido.toUpperCase().trim()+"%", "%"+usuario.trim()+"%");
        this.filtroAplicado = true;
        this.setMostrarModificar(false);
        this.setMostrarAgregar(false);
        return null;
    }

    /**
     *
     * @param e
     */
    public void guardarUsuarioOyente(ActionEvent e){
        FacesContext context = FacesContext.getCurrentInstance();
        GeolocalizacionBean geolocalizacionBean = (GeolocalizacionBean) context.getELContext().getELResolver().getValue(context.getELContext(), null, "GeolocalizacionBean");
        geolocalizacionBean.setLocalidad("");
        geolocalizacionBean.setIdLocalidad(-1);
        geolocalizacionBean.setDepartamento("");
        geolocalizacionBean.setIdDepartamento(-1);
        geolocalizacionBean.setProvincia("");
        geolocalizacionBean.setIdDepartamento(-1);
        geolocalizacionBean.setPais("");
        geolocalizacionBean.setIdPais(-1);
        this.setApellido("");
        this.setBarrio("");
        this.setCalle("");
        this.setCodPostal("");
        this.setDepto("");
        this.setMostrarAgregar(true);
        this.setMostrarModificar(false);
        this.setNombre("");
        this.setNumero("");
        this.setNumeroDocumento(0);
        this.setPassword("");
        this.setConfirmaPassword("");
        this.setPiso(0);
        this.setTipoDocumento("DNI");
        this.setUsuario("");
        this.setTooltipPermiso("");
        this.permisos.clear();
        this.permisosAsignados.clear();
    }

    /**
     *
     * @return
     */
    public String guardarUsuario() {
        FacesContext context = FacesContext.getCurrentInstance();
        if (!this.gestorUsuarioBean.existeNombreUsuario(this.getUsuario())) {
            if (!this.permisosAsignados.isEmpty()) {
                GeolocalizacionBean geolocalizacionBean = (GeolocalizacionBean) context.getELContext().getELResolver().getValue(context.getELContext(), null, "GeolocalizacionBean");
                this.gestorUsuarioBean.agregarUsuario(this.nombre.toUpperCase(), this.apellido.toUpperCase(),
                        this.usuario, this.password,
                        this.numeroDocumento, this.tipoDocumento.toUpperCase(),
                        this.calle.toUpperCase(), this.numero.toUpperCase(),
                        this.barrio.toUpperCase(), this.piso, this.depto.toUpperCase(),
                        this.codPostal.toUpperCase(), geolocalizacionBean.getIdLocalidad(),
                        geolocalizacionBean.getIdPais(), this.permisosAsignados);
                context.addMessage(null, new FacesMessage("Usuario guardado con exito", ""));
                this.mostrarAgregar = false;
                this.mostrarModificar = false;
            } else {
                context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Debe asignar por lo menos un permiso al usuario", ""));
            }
        } else {
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Ya existe un usuario con ese login", ""));
            this.setUsuario("");
        }
        return null;
    }

    /***
     *  busca si existe clave actual y si coinciden las nuevas claves.
     * Modifica la clave del usuario
     * @return null
     */
    public String modificarClave() {
        FacesContext context = FacesContext.getCurrentInstance();
        /***
         * esto tiene que estar en logueo bean y el modificar en el gestor usuario.
         */
         LogueoBean logueoBean = (LogueoBean) context.getELContext().getELResolver().getValue(context.getELContext(), null, "LogueoBean");
         String nombreUsuario = logueoBean.getUsuario();
         String claveUsuario = logueoBean.getClave();

        if (claveUsuario.equals(this.password) && this.nuevopassword.equals(this.confirmaPassword)) {
            this.gestorUsuarioBean.modificarClave(nombreUsuario, this.nuevopassword);
            context.addMessage(null, new FacesMessage("Clave modificada con exito. Recuerde ingresarla en su nueva sesión.", ""));
            this.setPassword("");
            this.setNuevopassword("");
            this.setConfirmaPassword("");
        } else {
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Datos incorrectos, ingréselos nuevamente", ""));
            this.setPassword("");
            this.setNuevopassword("");
            this.setConfirmaPassword("");
        }

        return null;

    }
    /**
     *
     * @param e
     */
    public void modificarUsuarioOyente(ActionEvent e){
        this.setMostrarModificar(true);
        this.setMostrarAgregar(false);
        this.setTooltipPermiso("");
        UIParameter component = (UIParameter) e.getComponent().findComponent("idUsuarioModi");
        this.setId((Integer)Integer.parseInt(component.getValue().toString()));
        Usuario usu = this.gestorUsuarioBean.encontrarUsuarioPorId(this.getId());
        this.setApellido(usu.getApellido());
        this.setNombre(usu.getNombre());
        this.setNumeroDocumento(usu.getNumeroDocumento());
        if(usu.getIdTipoDocumento()!=null){
            this.setTipoDocumento(usu.getIdTipoDocumento().getTipo());
        }else{
            this.setTipoDocumento("DNI");
        }
        this.setUsuario(usu.getUsuario());
        this.setPassword(usu.getPassword());
        this.setConfirmaPassword(usu.getPassword());
        if(this.permisosAsignados!=null)this.permisosAsignados.clear();
        else this.permisosAsignados = new ArrayList<String>();
        if(this.permisos!=null)this.permisos.clear();
        this.permisos = this.gestorUsuarioBean.permisos();
        for(Permiso p: usu.getPermisoCollection()){
            this.permisosAsignados.add(p.getNombre());
            this.permisos.remove(p.getNombre());
        }
        if(usu.getIdDomicilio()!=null){
            this.setBarrio(usu.getIdDomicilio().getBarrio());
            this.setCalle(usu.getIdDomicilio().getCalle());
            this.setCodPostal(usu.getIdDomicilio().getCodPostal());
            this.setDepto(usu.getIdDomicilio().getDepto());
            this.setIdDomicilio(usu.getIdDomicilio().getId());
            this.setNumero(usu.getIdDomicilio().getNumero());
            this.setPiso(usu.getIdDomicilio().getPiso());
        }else {
            this.setBarrio("");
            this.setCalle("");
            this.setCodPostal("");
            this.setDepto("");
            this.setIdDomicilio(-1);
            this.setNumero("");
            this.setPiso(0);
        }
        FacesContext context = FacesContext.getCurrentInstance();
        GeolocalizacionBean geolocalizacionBean = (GeolocalizacionBean) context.getELContext().getELResolver().getValue(context.getELContext(), null, "GeolocalizacionBean");
        if(usu.getIdDomicilio().getIdLocalidad()!=null){
            geolocalizacionBean.setPais(usu.getIdDomicilio().getIdLocalidad().getIdDepartamento().getIdProvincia().getIdPais().getNombre());
            geolocalizacionBean.setIdPais(usu.getIdDomicilio().getIdLocalidad().getIdDepartamento().getIdProvincia().getIdPais().getId());
            geolocalizacionBean.setProvincia(usu.getIdDomicilio().getIdLocalidad().getIdDepartamento().getIdProvincia().getNombre());
            geolocalizacionBean.setIdProvincia(usu.getIdDomicilio().getIdLocalidad().getIdDepartamento().getIdProvincia().getId());
            geolocalizacionBean.setDepartamento(usu.getIdDomicilio().getIdLocalidad().getIdDepartamento().getNombre());
            geolocalizacionBean.setIdDepartamento(usu.getIdDomicilio().getIdLocalidad().getIdDepartamento().getId());
            geolocalizacionBean.setLocalidad(usu.getIdDomicilio().getIdLocalidad().getNombre());
            geolocalizacionBean.setIdLocalidad(usu.getIdDomicilio().getIdLocalidad().getId());
        }else{
            geolocalizacionBean.setLocalidad("");
            geolocalizacionBean.setIdLocalidad(-1);
            geolocalizacionBean.setDepartamento("");
            geolocalizacionBean.setIdDepartamento(-1);
            geolocalizacionBean.setProvincia("");
            geolocalizacionBean.setIdProvincia(-1);
            geolocalizacionBean.setPais("");
            geolocalizacionBean.setIdPais(-1);
        }


    }

    /**
     *
     * @return
     */
    public String modificarUsuario() {
        FacesContext context = FacesContext.getCurrentInstance();
        if (!this.gestorUsuarioBean.existeNombreUsuarioModificar(this.getUsuario(), this.getId())) {
            if (!this.permisosAsignados.isEmpty()) {
                GeolocalizacionBean geolocalizacionBean = (GeolocalizacionBean) context.getELContext().getELResolver().getValue(context.getELContext(), null, "GeolocalizacionBean");
                this.gestorUsuarioBean.modificarUsuario(this.id, this.nombre.toUpperCase(),
                        this.apellido.toUpperCase(), this.usuario, this.password,
                        this.numeroDocumento, this.tipoDocumento.toUpperCase(),
                        this.calle.toUpperCase(), this.numero.toUpperCase(),
                        this.barrio.toUpperCase(), this.piso, this.depto.toUpperCase(),
                        this.codPostal.toUpperCase(), geolocalizacionBean.getIdLocalidad(),
                        geolocalizacionBean.getIdPais(), this.permisosAsignados);
                context.addMessage(null, new FacesMessage("Usuario modificado con exito", ""));
                this.mostrarAgregar = false;
                this.mostrarModificar = false;
            } else {
                context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Debe asignar por lo menos un permiso al usuario", ""));
            }
        } else {
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Ya existe un usuario con ese login", ""));
            this.setUsuario("");
        }
        return null;
    }

    /**
     *
     * @param e
     */
    public void eliminarUsuarioOyente(ActionEvent e){
        UIParameter component = (UIParameter) e.getComponent().findComponent("idBorrar");
        this.setId((Integer)Integer.parseInt(component.getValue().toString()));
    }

    /**
     *
     * @return
     */
    public String eliminarUsuario(){
        FacesContext context = FacesContext.getCurrentInstance();
        this.gestorUsuarioBean.eliminarUsuario(this.getId());
        context.addMessage(null, new FacesMessage("Usuario eliminado con exito", ""));
        return null;
    }

    /**
     *
     * @return
     */
    public String verificarExisteNombreUsuario() {
        FacesContext context = FacesContext.getCurrentInstance();
        if (this.mostrarAgregar) {
            if (this.gestorUsuarioBean.existeNombreUsuario(this.getUsuario())) {
                context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Ya existe un usuario con ese login", ""));
                this.setUsuario("");
            }
        } else if (this.mostrarModificar) {
            if (this.gestorUsuarioBean.existeNombreUsuarioModificar(this.getUsuario(), this.getId())) {
                context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Ya existe un usuario con ese login", ""));
                this.setUsuario("");
            }
        }

        return null;
    }

    /**
     * 
     * @return
     */
    public String verificarConfirmacionPassword() {
        if (!this.password.equals(this.confirmaPassword)) {
            FacesContext context = FacesContext.getCurrentInstance();
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "La clave y su confirmación son diferentes", ""));
            this.setConfirmaPassword("");
            
            }
        return null;
    }

    /**
     *
     * @return
     */
    public String mostrarTooltipPermiso(){
        datos.Permiso per = this.gestorUsuarioBean.encontrarPermisoPorNombre(this.nombrePermiso);
        if(per!=null){
            this.setTooltipPermiso(per.getDescripcion());
        }else{
            this.setTooltipPermiso("");
        }
        return null;
    }

    /**
     *
     * @param e
     */
    public void cancelarOyente(ActionEvent e) {
        this.setApellido("");
        this.setBarrio("");
        this.setCalle("");
        this.setCodPostal("");
        this.setDepto("");
        this.setMostrarAgregar(false);
        this.setMostrarModificar(false);
        this.setFiltroAplicado(false);
        this.setNombre("");
        this.setNumero("");
        this.setNumeroDocumento(0);
        this.setPassword("");
        this.setConfirmaPassword("");
        this.setPiso(0);
        this.setTipoDocumento("DNI");
        this.setUsuario("");
        this.setTooltipPermiso("");
    }

    /***
     * cancela los valores en el modalPanel
     */
    public void cancelarClaveOyente(ActionEvent e) {
        this.setPassword("");
        this.setNuevopassword("");
        this.setConfirmaPassword("");
    }

    /**
     * @return the nombrePermiso
     */
    public String getNombrePermiso() {
        return nombrePermiso;
    }

    /**
     * @param nombrePermiso the nombrePermiso to set
     */
    public void setNombrePermiso(String nombrePermiso) {
        this.nombrePermiso = nombrePermiso;
    }

    /**
     * @return the nuevopassword
     */
    public String getNuevopassword() {
        return nuevopassword;
    }

    /**
     * @param nuevopassword the nuevopassword to set
     */
    public void setNuevopassword(String nuevopassword) {
        this.nuevopassword = nuevopassword;
    }

    

    
    


}
